每一个窗口对象都有一个GetClientRect函数(它是CWnd的一个成员函数,每一个从CWnd派生的类都会继承它),用来返回当前窗口的区域。对话框有、对话框控件也有.....,那你就要看看是谁来调用这个GetClientRect函数的。
如果是在对话框内部调用的这个函数(GetClientRect前什么也没有加,每个类都有一个隐含的this指针),它当然返回的就是对话框的区域。
如果对话上一个CEdit控件,并有一个与他关联的成员变量(控件类型),m_wndEdtText,那个m_wndEdtText也是一个窗口,当你在对话内的成员函数调用m_wndEdtText.GetClientRect(&rect)的时候它返回的就是控件CEdit的区域。
关键你得看是谁调用了这个函数。CRect rect 生成的这个对象就表示一个矩形区域,表示了窗口的大小和位置,可以通过CRect类的方法,获该区域的具体信息,如顶点、窗口的高和宽。
rect是rectangle的简写,rectangle是长方形、矩形的意思。
默认坐标系:原点为左上角,右边为x轴正方向,下边为y轴正方向。
构造函数(CRect)有五个原型,第二个原型和第三个原型是拷贝构造函数。现在我用其它三个构造函数构造一个左上角坐标为(10,20),x方向边长为100,y方向边
长有200的矩形。
原型一:
CRect r1(10,20,110,220);
原型四:
POINT pt = {10,20}; SIZE size = {100,200}; CRect r2(pt,size);
原型五:
POINT topLeft = {10,20}; POINT bottomRight = {110,220} ; CRect r3(topLeft,bottomRight);
下面的代码可以查一个矩形的大小,新建一个单文档工程Sdi,修改OnDraw函数:
void CSdiView::OnDraw(CDC* pDC) { CSdiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CRect r1(10,20,110,220); pDC->Rectangle(&r1); }
取得宽度,int Width( ) const; int iWidth = r1.Width(); // iWidth为100。 取得高度,int Height( ) const; int iHeight = r1.Height(); //iHeight的结果是200。 取得宽和高,CSize Size( ) const; CSize size = r1.Size(); //size.cx为100,size.cy为200。
取得左上角的坐标,由于返回值是引用,所以可以通过此函数的返回值,修改左上角。 CPoint& TopLeft( ); CRect r1(10,20,110,220); r1.TopLeft().x = 0; r1.TopLeft().y = 0 ; r1的左上角坐标变为(0,0),也可以通过此函数取得左上角的坐标。 CRect r1(10,20,110,220); CPoint TopLeft = r1.TopLeft(); TopLeft.x的值为10,TopLeft.y的值为20。 BottomRight取得右下角坐标 取得中心得的坐标,CPoint CenterPoint( ) const; CPoint pt = r1.CenterPoint();// pt为(60,120)。
BOOL IsRectEmpty( ) const;如果长席或宽度为0或非法,返回真;否则返回假。 CRect r1(210,20,110,220); bool bEmpty = r1.IsRectEmpty(); 结果为真,因为左边比右边还大。 CRect::IsRectNull,四个边的坐标都为0,结果为真,否则为假。 BOOL PtInRect( POINT point ) const;查看一个点是否在矩形内。 CRect r1(10,20,110,220); POINT pt1={10,10}; POINT pt2={10,30}; bool bIn1 = r1.PtInRect(pt1); bool bIn2 = r1.PtInRect(pt2); bIn1为假,bIn2为真。
CRect::SetRect,设置四个边的值,用法类似于构造函数的原型一。 CRect::SetRectEmpty,将四个边的坐标设置为0。 void CopyRect( LPCRECT lpSrcRect );复制。 CRect r2; r2.CopyRect(&r1); r2的值和r1的值相同。
CRect::EqualRect,两个矩形是不是相同,四边坐标必须相同。 CRect r1(10,20,110,220); CRect r2(110,220,10,20); bool bEqual = r1.EqualRect(r2); bEqual的值为假,因为他们的上下左右边不同,是反过来的。 CRect r1(110,220,10,20); CRect r2(110,220,10,20); bool bEqual = r1.EqualRect(r2); bEqual为真,因为四边相同。
CRect::InflateRect,增加宽和高。 CRect r(0,0,0,0); r.InflateRect(2,3);//结果为(-2,-3,2,3); SIZE size = {3,2}; r.InflateRect(size);//结果为(-5,-5,5,5); CRect r1(-5,-5,-5,-5); r.InflateRect(&r1);//结果为(0,0,0,0); //左边左移-1(右移1),上边上移-1,右边右移2,下边下移2 r.InflateRect(-1,-1,2,2);//结果为(1,1,2,2);
CRect::DeflateRect,减少宽和高,方法与InflateRect类似。 CRect::NormalizeRect,标准化,调整上下边和左右边,使得符合人类逻辑。 CRect r(10,10,0,0); r.NormalizeRect(); 结果为(0,0,10,10)
CRect::OffsetRect,移动整个矩形。 CRect r(0,0,10,10); r.OffsetRect(1,1);//右移1,下移1 POINT point = {1,1}; r.OffsetRect(point);//再右移1,再下移1 SIZE size = {-2,-2}; r.OffsetRect(size);//右移-2,下移-2
CRect::SubtractRect,lpRectSrc1减去lpRectSrc2,
注意不是减号。过程不好表达,运行下面的代码就可以看到效果了。
void CSdiView::OnDraw(CDC* pDC) { pDC->SelectStockObject(NULL_BRUSH); CRect r1(10,10, 100,100); CRect r2(50,10, 150,150);//和CRect r2(50,50, 150,150);结果不一样 pDC->Rectangle(r1); pDC->Rectangle(r2); {//红色区域是SubtractRect的结果 CRect r ; r.SubtractRect(r1,r2); CBrush brush(RGB(255,0,0)); pDC->SelectObject(&brush); pDC->Rectangle(&r); } }
CRect::IntersectRect,求交集
void CSdiView::OnDraw(CDC* pDC) { pDC->SelectStockObject(NULL_BRUSH); CRect r1(10,10, 100,100); CRect r2(50,10, 150,150);//和CRect r2(50,50, 150,150);结果不一样 pDC->Rectangle(r1); pDC->Rectangle(r2); {//绿色区域是IntersectRect的结果 CRect r ; r.IntersectRect(r1,r2); CBrush brush(RGB(0,255,0)); pDC->SelectObject(&brush); pDC->Rectangle(&r); } }
CRect::UnionRect,求并集
void CSdiView::OnDraw(CDC* pDC) { pDC->SelectStockObject(NULL_BRUSH); CRect r1(10,10, 100,100); CRect r2(50,50, 150,150);//和CRect r2(50,50, 150,150);结果不一样 pDC->Rectangle(r1); pDC->Rectangle(r2); {//蓝色边框是UnionRect的结果 CRect r ; r.UnionRect(r1,r2); CPen pen(PS_DOT,1,RGB(0,0,255)); pDC->SelectObject(&pen); pDC->Rectangle(&r); } }
CRect::operator LPCRECT ,转化成LPCRECT类型。 CRect::operator LPRECT ,转化成LPRECT CRect r(0,0,100,100); LPCRECT pCRect = r; LPRECT pRect = r;
第二行会调用LPCRECT操作符,第三行调用LPRECT操作符。
typedef const RECT* LPCRECT; // pointer to read/only RECT typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
CRect::operator = ,重载“=”运算符,实际调用CopyRect。 CRect::operator ==,重载“==”运算符,实际调用EqualRect。 operator !=,重载“!=”运算符,实际调用EqualRect。 CRect::operator += ,重载“+=”运算符,第一个原型和第二个原型调用OffsetRect,第三个原型调用InflateRect。 CRect::operator -=,重载“-=”运算符,第一个原型和第二个原型调用OffsetRect,第三个原型调用InflateRect。 CRect::operator &=,重载“&=”运算符,实际调用IntersectRect。 CRect::operator |= 重载“|=”运算符,实际调用UnionRect。 +、-、&、|和上面的类似,就不再详细讲解了。
本页共202段,5342个字符,7716 Byte(字节)